package weblib

import (
	"context"
	"github.com/gin-gonic/gin"
	"goMicro/day05/client/services"
)

func PanicIfError(e error) {
	if e != nil {
		panic(e)
	}
}

func GetProdDetail(ctx *gin.Context) {
	prodServer := ctx.Keys["prodService"].(services.ProdService)
	var prodReq services.ProdRequest
	PanicIfError(ctx.BindUri(&prodReq))
	resp, _ := prodServer.GetProdDetail(context.Background(), &prodReq)
	ctx.JSON(200, gin.H{"data": resp.Data})

}

//  第三 、使用全局熔断
func GetProdList(ctx *gin.Context) {
	prodServer := ctx.Keys["prodService"].(services.ProdService)
	var prodReq services.ProdRequest
	if err := ctx.Bind(&prodReq); err != nil {
		ctx.JSON(500, gin.H{"status": err.Error()})
	} else {
		prodResp, _ := prodServer.GetProdList(ctx, &prodReq)
		ctx.JSON(200, gin.H{"data": prodResp.Data})
	}
}

////  第一 、未使用熔断之前的代码
//func GetProdList (ctx *gin.Context){
//	prodServer :=ctx.Keys["prodService"].(services.ProdService)
//	var prodReq services.ProdRequest
//	if err:=ctx.Bind(&prodReq) ;err!=nil{
//		ctx.JSON(500,gin.H{"status":err.Error()})
//	}else{
//		prodresp,err:=prodServer.GetProdList(ctx,&prodReq)
//		if err!=nil {
//			ctx.JSON(500,gin.H{"status":err.Error()})
//		}else {
//			ctx.JSON(200,gin.H{"data":prodresp.Data})
//		}
//	}
//}
////   第二 、使用局部熔断改造的代码
//func GetProdList (ctx *gin.Context){
//	prodServer :=ctx.Keys["prodService"].(services.ProdService)
//	var prodReq services.ProdRequest
//	if err:=ctx.Bind(&prodReq) ;err!=nil{
//		ctx.JSON(500,gin.H{"status":err.Error()})
//	}else{
//		//第一步 配置hystrix config
//		configA :=hystrix.CommandConfig{
//			Timeout:100,
//		}
//		//第二部配置command
//		hystrix.ConfigureCommand("getProds",configA)
//		//第三步 执行Do方法
//		var prodresp *services.ProdListResponse
//		// 3个参数 ： command名称 ，正常业务处理函数，降级处理函数
//		err:=hystrix.Do("getProds",func()error{
//			prodresp,err=prodServer.GetProdList(ctx,&prodReq)
//			return err
//		},func(e error)error{
//			prodresp,err=defaultProds()
//			return err
//		})
//		if err!=nil {
//			ctx.JSON(500,gin.H{"status":err.Error()})
//		}else {
//			ctx.JSON(200,gin.H{"data":prodresp.Data})
//		}
//	}
//}
//// 使用局部熔断的代码
//func defaultProds()(*services.ProdListResponse ,error){
//	models:=make([]*services.ProdModel,0)
//	var i int32
//	for i=0;i<5;i++{
//		models =append(models,newProd(200+i,"商品"+strconv.Itoa(200+int(i))))
//	}
//	resp:=&services.ProdListResponse{}
//	resp.Data = models
//	return resp,nil
//}
////测试方法
//func newProd(id int32,pname string)*services.ProdModel {
//	return &services.ProdModel{ProdID: id,ProdName:pname}
//}
